﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Financeiro.Dados;
using Model.LogisticaWS;
using System.Data;
using System.Globalization;

namespace Financeiro.Model
{
    public class CotaModel
    {
        private string setor;

        public CotaModel(string setor)
        {
            this.setor = setor;
        }

        public CotaModel()
        { }

        public double calculaValor(double valorBase)
        {
            try
            {
                double v = 0;                                                        // valor que será concedido pela cota
                RegraCotaModel regra = new RegraCotaModel(this.setor);              // obtem as regras de cota para determinado setor
                double cota = ContasModel.getSaldo() * regra.percentualCota();      // cota calculada com base em uma porcentagem do saldo

                // recupera dados da ultima cota
                DataRow ultimaCota = CotaDAO.obterUltimaCota(this.setor);           
                //caso especial em que não há nenhuma cota registrada...
                if (ultimaCota==null)
                {
                    CotaDAO.insertValor(this.setor, 0, 'a');
                    ultimaCota = CotaDAO.obterUltimaCota(this.setor);
                }


                //usar web-service para buscar o valor total dos pedidos estornados
                PedidosWS ws = new PedidosWS();
                double novosEstornos = ws.obterValorEstornadoEquipamentos(DateTime.Now) + ws.obterValorEstornadoMedicamentos(DateTime.Now);
                
                //mudar o valor dos estornos ao valor extra da ultima cota
                if (novosEstornos > 0)
                {
                    double extra = (novosEstornos + Convert.ToDouble(ultimaCota["extra"]));
                    CotaDAO.mudarCotaExtra(Convert.ToInt32(ultimaCota["id"]), extra);
                    ultimaCota = CotaDAO.obterUltimaCota(this.setor);
                }
                
                //calculo do valor do vaixa durante o período da cota
                double rest = Convert.ToDouble(ultimaCota["valor"]) + Convert.ToDouble(ultimaCota["extra"]);
                DateTime dateInicio = Convert.ToDateTime(ultimaCota["created"]);
                DataTable dtEquip = ws.obterRelatorioEquipamentos(dateInicio, DateTime.Now);
                foreach (DataRow drEquip in dtEquip.Rows)
                {
                    double preco = Convert.ToDouble(drEquip["Preco"]);
                    rest = rest - preco;
                }
                DataTable dtMedic = ws.obterRelatorioMedicamentos(dateInicio, DateTime.Now);
                foreach (DataRow drMedic in dtMedic.Rows)
                {
                    double preco = Convert.ToDouble(drMedic["Preco"]);
                    double qtde = Convert.ToDouble(drMedic["Quantidade"]);
                    rest = rest - preco * qtde;
                }

                //regras de permissão de cota
                if (cota > regra.cotaMinima() && valorBase > rest && valorBase < cota + rest)
                {
                    int qtdePedidos = dtEquip.Rows.Count + dtMedic.Rows.Count;
                    if (qtdePedidos > 1)
                    {
                        if (ContasModel.solicitaCota(cota) && CotaDAO.insertValor(this.setor, cota, 'a') != 0)
                        {
                            DataRow recemCota = CotaDAO.obterUltimaCota(this.setor);
                            CotaDAO.mudarCotaExtra(Convert.ToInt32(recemCota["id"]), rest);
                            v = (double)cota;
                        }
                    }
                    else if (Convert.ToChar(ultimaCota["tipo"]) != 's')
                    {
                        if (CotaDAO.insertValor(this.setor, cota, 's') != 0 && ContasModel.solicitaCota(cota))
                            v = (double)cota;
                    }
                }
                return v;
            }
            catch
            {
                return 0.0;
            }

        }

        public static DataTable obterCotas(DateTime start, DateTime end, string setor)
        {
            DataTable dt = CotaDAO.obterCotas(start, end, setor);
            return dt;
        }

        public static DataRow obterCota(int id)
        {
            return CotaDAO.obterCota(id);
        }

        public static DataTable cotaDetalhesPedido(int idCota)
        {
            DataTable dt = new DataTable();
            if (idCota != 0)
            {
                try
                {
                    CultureInfo culture = new CultureInfo("pt-BR");

                    DataRow cota = CotaDAO.obterCota(idCota);
                    DataRow nCota = CotaDAO.obterCota(idCota + 1);
                    PedidosWS ws = new PedidosWS();

                    DateTime dateIni = Convert.ToDateTime(cota["created"],culture);
                    DateTime dateFin = DateTime.Now;
                    if (nCota != null)
                        dateFin = Convert.ToDateTime(nCota["created"],culture);

                    DataTable dtMdc = ws.obterRelatorioMedicamentos(dateIni, dateFin);
                    DataTable dtEqp = ws.obterRelatorioEquipamentos(dateIni, dateFin);
                    dtMdc.Merge(dtEqp);
                    dt = dtMdc;

                    //pegar os pedidos das "pontas"
                }
                catch (Exception ex)
                {
                    throw new Exception("Erro ao buscar os detalhes dos gastos dos pedidos :: " + ex.Message);
                }
            }

            return dt;

        }

    }
}
